package com.ztesoft.book.core.sys.sysfile.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.google.common.collect.ImmutableList;
import com.google.common.io.Files;
import com.ztesoft.book.core.base.base.service.impl.BaseExServiceImpl;
import com.ztesoft.book.core.sys.sysfile.dto.SysFileDTO;
import com.ztesoft.book.core.sys.sysfile.enums.SysFileNameType;
import com.ztesoft.book.core.sys.sysfile.mapper.SysFileMapper;
import com.ztesoft.book.core.sys.sysfile.qo.SysFileQO;
import com.ztesoft.book.core.sys.sysfile.service.SysFileService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 系统附件表管理
 *
 * @author 万书涵
 * 创建时间：2021-07-01
 */
@Slf4j
@Service
public class SysFileServiceImpl extends BaseExServiceImpl<SysFileMapper, SysFileDTO, SysFileQO> implements SysFileService {

    /**
     * 图片
     */
    private final ImmutableList<String> IMAGE_TYPE_LIST = ImmutableList.of("gif", "jpg", "jpeg", "png");
    /**
     * 视频
     */
    private final ImmutableList<String> VIDEO_TYPE_LIST = ImmutableList.of("avi", "mp4");
    /**
     * 音频
     */
    private final ImmutableList<String> AUDIO_TYPE_LIST = ImmutableList.of("mp3");
    /**
     * 文档
     */
    private final ImmutableList<String> DOCUMENT_TYPE_LIST = ImmutableList.of("doc", "docx", "pdf", "xlsm", "xlsx",
            "xls", "txt");

    @Resource
    private SysFileMapper sysFileMapper;


    @Override
    protected SysFileMapper getMapper() {
        return sysFileMapper;
    }


    @Override
    public SysFileDTO saveOssFile(SysFileDTO dto) {
        // 设置文件类型
        String fileExt = Files.getFileExtension(dto.getName());
        dto.setFileType(getFileType(fileExt));
        dto.setSort(1);
        // 保存sys_file
        this.saveObject(dto);
        return dto;
    }

    /**
     * 更新文件
     *
     * @param mainId   mainId
     * @param fileList fileList
     * @param type     type
     */
    @Override
    public void updateFile(String mainId, List<SysFileDTO> fileList, String... type) {
        QueryWrapper<SysFileDTO> sysFileWrapper = new QueryWrapper<>();
        sysFileWrapper.lambda()
                .eq(SysFileDTO::getMainId, mainId)
                .in(SysFileDTO::getType, type)
                .eq(SysFileDTO::getIsDeleted, 0);
        List<SysFileDTO> imgList = sysFileMapper.selectList(sysFileWrapper);

        List<String> imgIds = fileList.stream().map(SysFileDTO::getId).collect(Collectors.toList());

        List<String> toDeleteList = imgList.stream().map(SysFileDTO::getId)
                .filter(menuId -> !imgIds.contains(menuId))
                .collect(Collectors.toList());
        // 新有旧无
        List<String> toAddList = imgIds.stream()
                .filter(id -> imgList.stream().map(SysFileDTO::getId).noneMatch(id::equals))
                .collect(Collectors.toList());
        if (CollUtil.isNotEmpty(toDeleteList)) {
            UpdateWrapper<SysFileDTO> updateWrapper = new UpdateWrapper<>();
            updateWrapper.lambda()
                    .set(SysFileDTO::getIsDeleted, 1)
                    .in(SysFileDTO::getId, toDeleteList);
            sysFileMapper.update(null, updateWrapper);
        }
        if (CollUtil.isNotEmpty(toAddList)) {
            UpdateWrapper<SysFileDTO> updateWrapper = new UpdateWrapper<>();
            updateWrapper.lambda()
                    .set(SysFileDTO::getMainId, mainId)
                    .in(SysFileDTO::getId, toAddList);
            sysFileMapper.update(null, updateWrapper);
        }
    }

    @Override
    public int updateMainIdByIdArray(String mainId, List<String> ids, String updateBy) {
        if (ids == null || ids.isEmpty()) {
            return 0;
        }
        return this.getMapper().updateMainIdByIdArray(mainId, ids, updateBy);
    }

    @Override
    public List<SysFileDTO> getSysFileDTOByMainId(String mainId) {
        if (StringUtils.isBlank(mainId)) {
            return new ArrayList<>();
        }
        SysFileQO qo = new SysFileQO();
        qo.setMainId(mainId);
        return this.findList(qo);
    }

    @Override
    public void deleteMainAndType(String mainId, String type) {
        this.getMapper().deleteMainAndType(mainId, type);
    }

    /**
     * 入库文件类型
     *
     * @param ext 文件后缀名
     * @return short
     */
    private int getFileType(String ext) {
        // 图片
        if (IMAGE_TYPE_LIST.contains(ext.toLowerCase())) {
            return SysFileNameType.IMAGE.getValue();
        }
        // 视频
        if (VIDEO_TYPE_LIST.contains(ext.toLowerCase())) {
            return SysFileNameType.VIDEO.getValue();
        }
        // 音频
        if (AUDIO_TYPE_LIST.contains(ext.toLowerCase())) {
            return SysFileNameType.AUDIO.getValue();
        }
        // 文档
        if (DOCUMENT_TYPE_LIST.contains(ext.toLowerCase())) {
            return SysFileNameType.DOCUMENT.getValue();
        }
        // 其他
        return SysFileNameType.OTHER.getValue();
    }
}
